﻿//Código desenvolvido na integra por João Ribeiro
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Web.Security;
using System.Data.SqlServerCe;
using System.Configuration;
using System.Data;

namespace GestaoContas
{
    class ContaDeUtilizador
    {
        private string _connectionStringLogin;
        private string _connectionStringJardimBD;


        public ContaDeUtilizador()
        {
            _connectionStringLogin = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
        }

        public ContaDeUtilizador(int pessoaId, string nome, string morada, int telefone, int telemovel, int contribuinte, string email, string userId, string role)
        {
            _pessoaId = pessoaId;
            _nome = nome;
            _morada = morada;
            _telefone = telefone;
            _telemovel = telemovel;
            _contribuinte = contribuinte;
            _email = email;
            _roleDoUtilizador = role;
            _userId = userId;

            _connectionStringLogin = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
        }

        public ContaDeUtilizador(string nome, string morada, int telefone, int telemovel, int contribuinte, string email, string userName, string password, string role)
        {
            _nome = nome;
            _morada = morada;
            _telefone = telefone;
            _telemovel = telemovel;
            _contribuinte = contribuinte;
            _email = email;
            _userName = userName;
            _password = password;
            _roleDoUtilizador = role;

            _connectionStringLogin = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
        }

        private int _pessoaId;

        public int PessoaId
        {
            get { return _pessoaId; }
            set { _pessoaId = value; }
        }


        private string _nome;

        public string Nome
        {
            get { return _nome; }
            set { _nome = value; }
        }

        private string _morada;

        public string Morada
        {
            get { return _morada; }
            set { _morada = value; }
        }

        private int _telefone;

        public int Telefone
        {
            get { return _telefone; }
            set { _telefone = value; }
        }

        private int _telemovel;

        public int Telemovel
        {
            get { return _telemovel; }
            set { _telemovel = value; }
        }

        private int _contribuinte;

        public int Contribuinte
        {
            get { return _contribuinte; }
            set { _contribuinte = value; }
        }

        private string _email;

        public string Email
        {
            get { return _email; }
            set { _email = value; }
        }


        private string _userName;

        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }

        private string _password;

        public string Password
        {
            get { return _password; }
            set { _password = value; }
        }

        private string _roleDoUtilizador;

        public string RoleDoUtilizador
        {
            get { return _roleDoUtilizador; }
            set { _roleDoUtilizador = value; }
        }

        /// <summary>
        /// User ID da bd da membership
        /// </summary>
        private string _userId;

        public string UserId
        {
            get { return _userId; }
            set { _userId = value; }
        }

        /// <summary>
        /// Cria conta na base de dados do jardim de infância e o respectivo login.
        /// </summary>
        /// <returns>True, se a conta foi criada com sucesso; False, no caso contrário</returns>
        public bool CriarConta()
        {
            bool userCriado = true;
            bool pessoaCriada = true;

            /*************************************
                *  CRIAÇÃO DA CONTA NA BD DE LOGIN  *
                * ***********************************/
            try
            {
                if (_email != null)  // se tiver email inserido, é usado na criação da conta
                {
                    Membership.CreateUser(_userName, _password, _email);
                }
                else
                {
                    Membership.CreateUser(_userName, _password);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                userCriado = false;
            }

            /*****************************************************************
                * CRIAÇÃO DO REGISTO DO UTILIZADOR NA BD DO JARDIM DE INFANCIA  *
                * ***************************************************************/
            if (userCriado)
            {

                string insertString = @"INSERT INTO Pessoa (Nome, Morada, Telefone, Telemovel, Email, NumeroContribuinte, Userid, Role) ";
                insertString += "VALUES (@nome, @morada, @telefone, @telemovel, @email, @numerocontribuinte, @userid, @role)";

                try
                {
                    SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                    conn.Open();

                    SqlCeCommand insertCommand = new SqlCeCommand(insertString, conn);

                    insertCommand.Parameters.AddWithValue("@nome", _nome);
                    insertCommand.Parameters.AddWithValue("@morada", _morada);
                    insertCommand.Parameters.AddWithValue("@telefone", _telefone);
                    insertCommand.Parameters.AddWithValue("@telemovel", _telemovel);
                    insertCommand.Parameters.AddWithValue("@email", _email);
                    insertCommand.Parameters.AddWithValue("@numerocontribuinte", _contribuinte);
                    insertCommand.Parameters.AddWithValue("@role", _roleDoUtilizador);
                    insertCommand.Parameters.AddWithValue("@userid", Membership.GetUser(_userName).ProviderUserKey.ToString());

                    insertCommand.ExecuteNonQuery();
                    insertCommand.Parameters.Clear();
                    insertCommand.Dispose();
                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Erro na criação da pessoa!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    pessoaCriada = false;
                }

                /* Se o utilizador foi criado na bd do jardim de infancia é feita a configuração
                    * final da associação da conta de login com a sua role, caso contrário é apagado
                    * o login.
                */
                if (pessoaCriada)   // associa a role com o user
                {
                    //LigacaoRoleUser(GetRoleId(comboBoxTipoConta.Text), GetUserId(textBoxUser.Text));
                    Roles.AddUserToRole(_userName, _roleDoUtilizador);
                }
                else
                {
                    Membership.DeleteUser(_userName, true);
                }
            }
            return pessoaCriada;
        }

        /// <summary>
        /// Guarda as alterações nos dados da pessoas e/ou no login.
        /// </summary>
        /// <returns>True, se foi feita alguma alteração; False, caso contrário.</returns>
        public bool GuardaAlteracaoPessoa()
        {
            string updateString = @"UPDATE Pessoa SET Nome = @nome, Morada = @morada, ";
            updateString += "Telefone = @telefone, Telemovel = @telemovel, ";
            updateString += "Email = @email, NumeroContribuinte = @numerocontribuinte, ";
            updateString += "Role = @role ";
            updateString += "WHERE PessoaId = " + _pessoaId;
            bool pessoaAlterada = true;
            try
            {
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                conn.Open();

                SqlCeCommand insertCommand = new SqlCeCommand(updateString, conn);

                insertCommand.Parameters.AddWithValue("@nome", _nome);
                insertCommand.Parameters.AddWithValue("@morada", _morada);
                insertCommand.Parameters.AddWithValue("@telefone", _telefone);
                insertCommand.Parameters.AddWithValue("@telemovel", _telemovel);
                insertCommand.Parameters.AddWithValue("@email", _email);
                insertCommand.Parameters.AddWithValue("@numerocontribuinte", _contribuinte);
                insertCommand.Parameters.AddWithValue("@role", _roleDoUtilizador);

                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters.Clear();
                insertCommand.Dispose();
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro na alteração da pessoa!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                pessoaAlterada = false;
            }
            return pessoaAlterada;
        }

        /// <summary>
        /// Preenche o objecto da conta de utilizador usando dois argumentos de busca.
        /// </summary>
        /// <param name="nomeQuerySearch">Nome a procurar</param>
        /// <param name="contribuinteQuerySearch">Contribuinte a procurar</param>
        public void PreencheOjectoContaUtilizador(string nomeQuerySearch, string contribuinteQuerySearch)
        {

            string query = @"SELECT PessoaId, Nome, Morada, Telefone, Telemovel, Email, NumeroContribuinte, Role, Userid ";
            query += "FROM Pessoa ";
            query += "WHERE Nome = '" + nomeQuerySearch + "' AND NumeroContribuinte = " + contribuinteQuerySearch;

            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();

            try
            {
                using (SqlCeCommand cmd = new SqlCeCommand(query, conn))
                {
                    using (SqlCeDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        reader.Read();
                        _pessoaId = int.Parse(reader[0].ToString());
                        _nome = reader[1].ToString();
                        _morada = reader[2].ToString();
                        _telefone = int.Parse(reader[3].ToString());
                        _telemovel = int.Parse(reader[4].ToString());
                        _email = reader[5].ToString();
                        _contribuinte = int.Parse(reader[6].ToString());
                        _roleDoUtilizador = reader[7].ToString();
                        _userId = reader[8].ToString();

                        reader.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Compara com a conta antes da alteração para verificar se realmente existiu alguma 
        /// alteração nos campos.
        /// </summary>
        /// <param name="contaAntiga">False, caso tenha havido alguma alteração</param>
        /// <returns></returns>
        public bool Igual(ContaDeUtilizador contaAntiga)
        {
            bool contaIgual = true;

            if (_nome != contaAntiga.Nome ||
                _morada != contaAntiga.Morada ||
                _telefone != contaAntiga.Telefone ||
                _telemovel != contaAntiga.Telemovel ||
                _contribuinte != contaAntiga.Contribuinte ||
                _email != contaAntiga.Email ||
                _roleDoUtilizador != contaAntiga.RoleDoUtilizador)
            {
                contaIgual = false;
            }
            return contaIgual;
        }
    }
}
